﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using bibliotecaObservador;
using SIGEB.Prototipo.Control;
using SIGEB.Prototipo.Vista.moduloPerfiles;
using SIGEB.Modelo;
using SIGEB.Modelo.moduloPerfiles;
using SIGEB.Modelo.moduloUsuarios;
using SIGEB.Modelo.moduloGrupo;
using DetectaRedes;

namespace SIGEB.Prototipo.Vista.moduloUsuarios
{
    public partial class frm_Usuarios : frm_IMEC
    {
        #region "constructores"

        public frm_Usuarios():base()
        {
            InitializeComponent();
            inicializarComponentes();
            this.dgv_busqueda = dgv_busqueda;
        }

        public frm_Usuarios(controlPrincipal cp):base(cp)
        {
            InitializeComponent();
            asignarUI(this.Controls);
            inicializarComponentes();
            base.dgv_busqueda = dgv_Listado;
        }

        private void inicializarComponentes()
        {
            dgv_busqueda = dgv_Listado;
            iniciaArbol();
        }

        private void iniciaArbol()
        {
            arbol = new manejaArbol();
            arbol.agregaSelectAll(checkBox65);
            arbol.agregarHijos(cbx_computadoras1, new CheckBox[] { cbx_PC1 });
            arbol.agregarHijos(cbx_documentos2, new CheckBox[] { doc1, doc2, doc3, doc4 });
            arbol.agregarHijos(cbx_tipoPerfil4, new CheckBox[] { tiperf1, tiperf2, tiperf3, tiperf4 });
            arbol.agregarHijos(cbx_usr5, new CheckBox[] { usr1, usr2, usr3, usr4, usr5, usr6, perf3, perf4, perf5, grps4, grps6 });
            arbol.agregarHijos(cbx_tipusr6, new CheckBox[] { tipusr1, tipusr2, tipusr3, tipusr4 });
            arbol.agregarHijos(cbx_grps7, new CheckBox[] { grps1, grps2, grps3, grps5 });
            arbol.agregarHijos(cbx_notif8, new CheckBox[] { notif1 });
            arbol.agregarHijos(cbx_mult9, new CheckBox[] { mult1, mult2, mult3, mult4 });
            arbol.agregarHijos(cbx_prest10, new CheckBox[] { prest1, prest2, prest3, prest4, prest5, prest6 });
            arbol.agregarHijos(cbx_res11, new CheckBox[] { res1, res2, res3, res4, res5, res6, res7 });
            arbol.agregarHijos(cbx_cons12, new CheckBox[] { cons1 });
            arbol.agregarHijos(cbx_est13, new CheckBox[] { est1, est2 });
            arbol.agregarHijos(cbx_tipdoc14, new CheckBox[] { tipodoc1, tipodoc2, tipodoc3, tipodoc4 });
        }

        #endregion

        #region "eventos"

        private void txb_nombre_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar) || Char.IsControl(e.KeyChar))
            {
                e.Handled = true;
            }
        }

        private void txb_apellido1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar) || Char.IsControl(e.KeyChar))
            {
                e.Handled = true;
            }
        }

        private void txb_apellido2_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar) || Char.IsControl(e.KeyChar))
            {
                e.Handled = true;
            }
        }

        private void btn_asignarCont_Click(object sender, EventArgs e)
        {
            frm_cambioContrasena frm = new frm_cambioContrasena(cp, usuarioActual.idUsuario, 1);
            frm.ShowDialog();
        }

        private void btn_verMultas_Click(object sender, EventArgs e)
        {
            if (usuarioActual != null)
            {
                cp.abrirVentana(this, controlPrincipal.VENTANA_MULTAS, new object[] { usuarioActual.idUsuario });
            }
        }

        public override void actualizar(object referencia, bibliotecaObservador.EventoActualizacion e)
        {
            int numConjunto = (int)referencia;
            if (numConjunto == conjuntoBase.CONJTIPOSPERFIL || numConjunto == conjuntoBase.CONJUSUARIOS)
            {
                cargarDatosUsuario();
            }
            else if (numConjunto == conjuntoBase.CONJTIPOUSUARIO)
            {
                cargarDatosTipoUsuario();
            }
            else if (numConjunto == conjuntoBase.CONJGRUPOS)
            {
                cargarDatosGrupo();
            }
            else if (numConjunto == conjuntoBase.CONJUSUARIOS)
            {

            }
        }

        private void cargarDatosGrupo()
        {
            try
            {
                grupos = cp.ctrlUsuario.obtenerGrupos();
            }
            catch (Exception e)
            {
                ventanaError(e.Message);
            }
            llenarGrupos(grupos);
        }

        private void cargarDatosPerfil()
        {
            if (usuarioActual != null)
            {
                arbol.ingresarPermisos(usuarioActual.permisos);
            }
                 
        }

        private void cargarDatosTipoUsuario()
        {
            try
            {
                if (cp.usuarioActualPuede(acciones.USER_CONSULTAR_TOD))
                {
                    tiposUsuario = cp.ctrlUsuario.obtenerTipoUsuarios();
                    llenearTipoUsuarios(tiposUsuario);
                }
            }
            catch (Exception e)
            {
                ventanaError(e.Message);
            }
        }

        private void cargarDatosUsuario()
        {
            try
            {
                datosActuales = cp.ctrlUsuario.todosUsuarios();
            }
            catch (Exception e)
            {
                ventanaError(e.Message);
            }
            usuarioActual = null;
            mostrarDatosUsuario();
        }

        private void mostrarDatosUsuario()
        {
            LinkedList<usuario> mostrar = null;
            if (sinBusqueda())
            {
                mostrar = datosActuales;
            }
            else
            {
                mostrar = datosBusqueda();
            }
            llenarDTGUsr(mostrar);
        }

        private LinkedList<usuario> datosBusqueda()
        {
            int a = getCategoriaBusqueda();
            LinkedList<usuario> mostrar = datosActuales;
            try
            {
                mostrar = datosActuales;
                if (a == MOROSOS)
                {
                    mostrar = cp.ctrlUsuario.usuariosMorosos();
                }
                if (a == MULTAS)
                {
                    mostrar = cp.ctrlUsuario.usuariosMultas();
                }
                if (a == TODOS)
                {
                    mostrar = datosActuales;
                }
                if (!string.IsNullOrEmpty(txb_busqueda.Text))
                {
                    mostrar = cp.ctrlUsuario.usuariosById(mostrar, txb_busqueda.Text);
                }
            }
            catch (Exception e)
            {
                ventanaError(e.Message);
            }
            return mostrar;
        }

        private bool sinBusqueda()
        {
            return getCategoriaBusqueda() == -1 && string.IsNullOrEmpty(txb_busqueda.Text);
        }

        private void cargarTodosDatosComboBox()
        {
            llenarTipoBusqueda();
            cargarDatosGrupo();
            cargarDatosTipoUsuario();
            cargarSexos();
        }

        private void cmb_tipoUsuario_SelectedValueChanged(object sender, EventArgs e)
        {
            borrarError(cmb_tipoUsuario);
            lbl_mensajes.Text = string.Empty;

            if (!eventoGrupoblocked)
            {
                eventoGrupoblocked = true;
                tipoUsuario tp = getTipoUsuarioSelected2();
                if (getTipoUsuarioSelected() == "TODOS")
                {
                    cargarDatosGrupo();
                }
                if (tp != null)
                {
                    LinkedList<grupo> nuevo = new LinkedList<grupo>();
                    foreach (grupo act in grupos)
                    {
                        if (act.tipoUsuarioCodigo == tp.codTipoUsuario)
                        {
                            nuevo.AddLast(act);
                        }
                    }
                    llenarGrupos(nuevo);
                }
                eventoGrupoblocked = false;
            }
        }

        private void cmb_grupo_SelectedValueChanged(object sender, EventArgs e)
        {
            borrarError(cmb_grupo);
            lbl_mensajes.Text = string.Empty;

            if (!eventoGrupoblocked)
            {
                eventoGrupoblocked = true;

                grupo g = getGrupoSelected2();
                if (g != null)
                {
                    seleccionarTipoUsuario(g.tipoUsuarioCodigo);
                    if (tiposPerfilesDiferentes(g.codGrupo))
                    {
                        actualizarPerfiles(g.codGrupo);
                    }
                }

                eventoGrupoblocked = false;
            }
        }

        private void cmb_categoriaBusqueda_SelectedValueChanged(object sender, EventArgs e)
        {
            mostrarDatosUsuario();
        }

        private void actualizarPerfiles(string idGrupo)
        {
            try
            {
                tipoPerfil n = cp.ctrlUsuario.tipoPerfilByGrupo(idGrupo);
                if (n != null)
                {
                    arbol.ingresarPermisos(n.permisosPredeterminados);
                }
            }
            catch (Exception e)
            {
                ventanaError(e.Message);
            }
        }

        private bool tiposPerfilesDiferentes(string idGrupo)
        {
            try
            {
                tipoPerfil n = cp.ctrlUsuario.tipoPerfilByGrupo(idGrupo);
                if (usuarioActual != null && n != null)
                {
                    tipoPerfil ac = cp.ctrlUsuario.tipoPerfilByGrupo(usuarioActual.idGrupo);
                    return ac.codTipoPerfil != n.codTipoPerfil;
                }
            }
            catch (Exception e)
            {
                ventanaError(e.Message);
                return false;
            }
            return true;
        }

        /// <summary>
        /// se llama cada vez que se abre la ventana y recibe
        /// los parámetros
        /// </summary>
        /// <param name="arg">se usa para que se le pase cualquier tipo de objeto al abrir la ventana</param>
        public override void hacerVisible(object[] arg)
        {
            base.hacerVisible(arg);
            PasarConsulta();
            
            cargarTodosDatosComboBox();
            cargarDatosUsuario();
            actualizaControles();
            
        }

        /// <summary>
        /// se activa cuando se selecciona alguna fila del DGV
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dgv_listado_SelectionChanged(object sender, EventArgs e)
        {
            if (estado.CONSULTANDO())
            {
                usuarioActual = getSelected();
                escribirUsuario();
            }
            actualizaControles();
        }

        private void cargarSexos()
        {
            cmb_sexo.Items.Clear();
            cmb_sexo.Items.Add(new comboBoxItem("Mujer", "Mujer"));
            cmb_sexo.Items.Add(new comboBoxItem("Hombre", "Hombre"));
        }

        private void txb_telefono_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsLetter(e.KeyChar) || Char.IsWhiteSpace(e.KeyChar) || Char.IsSymbol(e.KeyChar) || Char.IsPunctuation(e.KeyChar))
            {
                e.Handled = true;
            }
        }

        private void txt_Identificacion_TextChanged(object sender, EventArgs e)
        {
            //borrarError(txt_Identificacion);
            //lbl_mensajes.Text = string.Empty;
        }

        private void txb_cedula_TextChanged(object sender, EventArgs e)
        {
            //borrarError(txb_cedula);
            //lbl_mensajes.Text = string.Empty;
        }

        private void txb_nombre_TextChanged(object sender, EventArgs e)
        {
            //borrarError(txb_nombre);
            //lbl_mensajes.Text = string.Empty;
        }

        private void txb_apellido1_TextChanged(object sender, EventArgs e)
        {
            //borrarError(txb_apellido1);
            //lbl_mensajes.Text = string.Empty;
        }

        private void txb_apellido2_TextChanged(object sender, EventArgs e)
        {
            //borrarError(txb_apellido2);
            //lbl_mensajes.Text = string.Empty;
        }

        private void cmb_sexo_SelectedIndexChanged(object sender, EventArgs e)
        {
            //borrarError(cmb_sexo);
            //lbl_mensajes.Text = string.Empty;
        }

        private void txb_busqueda_TextChanged(object sender, EventArgs e)
        {
            if (estado.CONSULTANDO())
            {
                mostrarDatosUsuario();
            }
        }

        private void txb_busqueda_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode.Equals(Keys.Enter))
            {
                if (txb_busqueda.Text.Equals(string.Empty))
                {
                    lbl_mensajes.Text = "Ingrese un criterio de búsqueda.";
                }
            }
        }

        #endregion

        #region "captura"

        /// <summary>
        /// obtiene el id del tipo perfil que fue seleccionado
        /// del combo box del los tipos de perfil
        /// </summary>
        /// <returns></returns>
        private grupo getGrupoSelected2()
        {
            try
            {
                string idGrupo = ((comboBoxItem)cmb_grupo.SelectedItem).id;
                return getGrupobyId(idGrupo);

            }
            catch
            {
                return null;
            }
        }

        private grupo getGrupobyId(string idGrupo)
        {
            if (grupos != null && idGrupo != null && idGrupo != "")
            {
                foreach (grupo act in grupos)
                {
                    if (act.codGrupo == idGrupo)
                        return act;
                }
            }
            return null;
        }

        private int getCategoriaBusqueda()
        {
            try
            {
                string cat = ((comboBoxItem)cmb_categoriaBusqueda.SelectedItem).id;
                return int.Parse(cat);
            }
            catch
            {
                return -1;
            }
        }

        private string getGrupoSelected()
        {
            try
            {
                return ((comboBoxItem)cmb_grupo.SelectedItem).id;;

            }
            catch
            {
                return null;
            }
        }

        private tipoUsuario getTipoUsuarioSelected2()
        {
            try
            {
                string idtipoUsuario = ((comboBoxItem)cmb_tipoUsuario.SelectedItem).id; 
                return getTipoUsuariobyId(idtipoUsuario);

            }
            catch
            {
                return null;
            }
        }

        private tipoUsuario getTipoUsuariobyId(string idtipoUsuario)
        {
            if (tiposUsuario != null && idtipoUsuario != null && idtipoUsuario != "")
            {
                foreach (tipoUsuario act in tiposUsuario)
                {
                    if (act.codTipoUsuario == idtipoUsuario)
                    {
                        return act;
                    }
                }
            }
            return null;
        }

        /// <summary>
        /// obtiene el id del tipo perfil que fue seleccionado
        /// del combo box del los tipos de perfil
        /// </summary>
        /// <returns></returns>
        private string getTipoUsuarioSelected()
        {
            try
            {
                return ((comboBoxItem)cmb_tipoUsuario.SelectedItem).id;
            }
            catch
            {
                return null;
            }
        }


        /// <summary>
        /// obtiene un tipoUsuario creado con los campos de texto y combo box que hayan en el momento
        /// </summary>
        /// <returns></returns>
        private usuario getFromFields()
        {
            return new usuario(txt_Identificacion.Text, txb_cedula.Text, txb_nombre.Text, txb_apellido1.Text, txb_apellido2.Text, getSexoSelected(), null, txb_domicilio.Text,
                txb_email.Text, txb_telefono.Text, getGrupoSelected(), arbol.leerPermisos());   
        }

        private bool getSexoSelected()
        {
            try
            {
                string a = ((comboBoxItem)cmb_sexo.SelectedItem).mostrar;
                return a == "Mujer";
            }
            catch
            {
                return true;
            }
        }

        /// <summary>
        /// obtieneel tipoUsuario que se seleccionó del DGV
        /// </summary>
        /// <returns></returns>
        private usuario getSelected()
        {
            usuario nuevo = null;
            try
            {
                dgv_Listado.Rows[dgv_Listado.SelectedCells[0].RowIndex].Selected = true;
                String codigo = dgv_Listado.SelectedRows[0].Cells[0].Value.ToString();
                if (codigo != null)
                {
                    nuevo = getTipoUsuario(codigo);
                    if (nuevo != null)
                    {
                        usuarioActual = nuevo;
                    }
                }
            }
            catch
            {
            }
            return nuevo;
        }

        /// <summary>
        /// obtiene un tipoUsuario entre la lista de datosActuales
        /// </summary>
        /// <param name="codigo"></param>
        /// <returns></returns>
        private usuario getTipoUsuario(String codigo)
        {
            if (datosActuales != null)
            {
                foreach (usuario act in datosActuales)
                {
                    if (act.idUsuario == codigo)
                    {
                        return act;
                    }
                }
            }
            return null;
        }

        #endregion

        #region "métodos"

        private bool validarCamposAgregar()
        {
            bool valido = true;
            if (txt_Identificacion.Text.Equals(string.Empty))
            {
                setError(txt_Identificacion, "Ingrese una identificacion para el Usuario.");
                valido = false;
            }
            else
            {
                borrarError(txt_Identificacion);
            }
            if (txb_cedula.Text.Length < 11)
            {
                //setError(txb_cedula, "Ingrese la cédula del Usuario.");
            }
            else
            {
                borrarError(txb_cedula);
            }
            if (txb_nombre.Text.Equals(string.Empty))
            {
                setError(txb_nombre, "Ingrese el nombre del Usuario.");
                valido = false;
            }
            else
            {
                borrarError(txb_nombre);
            }
            if (txb_apellido1.Text.Equals(string.Empty))
            {
                setError(txb_apellido1, "Ingrese el primer apellido.");
                valido = false;
            }
            else
            {
                borrarError(txb_apellido1);
            }
            if (txb_apellido2.Text.Equals(string.Empty))
            {
                setError(txb_apellido2, "Ingrese el segundo apellido.");
                valido = false;
            }
            else
            {
                borrarError(txb_apellido2);
            }
            if (cmb_sexo.SelectedIndex.Equals(-1))
            {
                setError(cmb_sexo, "Seleccione el sexo del Usuario.");
                valido = false;
            }
            else
            {
                borrarError(cmb_sexo);
            }
            if (cmb_grupo.SelectedIndex.Equals(-1))
            {
                setError(cmb_grupo, "Seleccione el grupo al que pertenece el Usuario.");
                valido = false;
            }
            else
            {
                borrarError(cmb_grupo);
            }
            return valido;
        }

        private bool validarCamposModificar(usuario n)
        {
            bool valido = true;
            try
            {
                if (!cp.ctrlUsuario.idUsuarioValido(n.idUsuario))
                {
                    setError(txt_Identificacion, "Ingrese una identificacion para el Usuario.");
                    valido = false;
                }
                else
                {
                    borrarError(txt_Identificacion);
                }
                if (!cp.ctrlUsuario.idUsuarioValido(n.cedula))
                {
                    setError(txb_cedula, "Ingrese la cédula válida del Usuario.");
                }
                else
                {
                    borrarError(txb_cedula);
                }
                if (!cp.ctrlUsuario.campoNombreValido(n.nombre))
                {
                    setError(txb_nombre, "Ingrese el nombre del Usuario.");
                    valido = false;
                }
                else
                {
                    borrarError(txb_nombre);
                }
                if (!cp.ctrlUsuario.campoApellido1Valido(n.apellido1))
                {
                    setError(txb_apellido1, "Ingrese el primer apellido.");
                    valido = false;
                }
                else
                {
                    borrarError(txb_apellido1);
                }
                if (!cp.ctrlUsuario.campoApellido2Valido(n.apellido2))
                {
                    setError(txb_apellido2, "Ingrese el segundo apellido.");
                    valido = false;
                }
                else
                {
                    borrarError(txb_apellido2);
                }
                if (cmb_sexo.SelectedIndex.Equals(-1))
                {
                    setError(cmb_sexo, "Seleccione el sexo del Usuario.");
                    valido = false;
                }
                else
                {
                    borrarError(cmb_sexo);
                }
                if (!cp.ctrlUsuario.idGrupoValido(n.idGrupo))
                {
                    setError(cmb_grupo, "Seleccione el grupo al que pertenece el Usuario.");
                    valido = false;
                }
                else
                {
                    borrarError(cmb_grupo);

                }
            }
            catch (Exception e)
            {
                ventanaError(e.Message);
                return false;
            }
            return valido;
        }

        /// <summary>
        /// escribe tipoUsrActual en los campos de texto
        /// </summary>
        private void escribirUsuario()
        {

            if (usuarioActual != null)
            {
                txt_Identificacion.Text = usuarioActual.idUsuario;
                txb_cedula.Text = usuarioActual.cedula;
                txb_apellido1.Text = usuarioActual.apellido1;
                txb_apellido2.Text = usuarioActual.apellido2;
                txb_nombre.Text = usuarioActual.nombre;
                txb_telefono.Text = usuarioActual.telefono;
                txb_email.Text = usuarioActual.email;
                txb_domicilio.Text = usuarioActual.domicilio;
                seleccionarSexo(usuarioActual.mujer);
                seleccionarGrupo(usuarioActual.idGrupo);
                arbol.ingresarPermisos(usuarioActual.permisos);
            }
            else
            {
                limpiarCampos();
            }
        }

        /// <summary>
        /// en el combo box selecciona el nombre del tipoPerfil que se le indique
        /// de acuerdo con el parámetro que debe ser el código del tipoPerfil
        /// </summary>
        /// <param name="p"></param>
        private void seleccionarGrupo(string p)
        {
            foreach (object act in cmb_grupo.Items)
            {
                if (((comboBoxItem)act).id == p)
                {
                    cmb_grupo.Text = ((comboBoxItem)act).mostrar;
                    return;
                }
            }
        }

        private void seleccionarTipoUsuario(string p)
        {
            foreach (object act in cmb_tipoUsuario.Items)
            {
                if (((comboBoxItem)act).id == p)
                {
                    cmb_tipoUsuario.Text = ((comboBoxItem)act).mostrar;
                    break;
                }
            }
        }

        /// <summary>
        /// Llena en el combo box sexo masculino o femenino
        /// </summary>
        /// <param name="mujer"></param>
        private void seleccionarSexo(bool mujer)
        {
            if (mujer)
            {
                cmb_sexo.Text = "Mujer";
            }
            else
            {
                cmb_sexo.Text = "Hombre";
            }
        }

        private void llenarTipoBusqueda()
        {
            cmb_categoriaBusqueda.Items.Clear();
            cmb_categoriaBusqueda.Items.Add(new comboBoxItem(TODOS.ToString(), "TODOS LOS USUARIOS"));
            cmb_categoriaBusqueda.Items.Add(new comboBoxItem(MOROSOS.ToString(), "USUARIOS MOROSOS"));
            cmb_categoriaBusqueda.Items.Add(new comboBoxItem(MULTAS.ToString(), "USUARIOS CON MULTAS"));
        }

        /// <summary>
        /// lista en el ComboBox la lista que reciba por parámetro.
        /// Solamente listará los nombres del tipoPerfil
        /// </summary>
        /// <param name="tipoUsuarios"></param>
        private void llenearTipoUsuarios(LinkedList<tipoUsuario> tipoUsuarios)
        {
            cmb_tipoUsuario.Items.Clear();
            if (tipoUsuarios != null)
            {
                cmb_tipoUsuario.Items.Add(new comboBoxItem("TODOS", "todos"));
                foreach (tipoUsuario act in tipoUsuarios)
                {
                    cmb_tipoUsuario.Items.Add(new comboBoxItem(act.codTipoUsuario, act.nombre));
                }   
            }
        }

        /// <summary>
        /// Ingresa en el combo box de grupos, todos los grupos que recibe por el parametro grupos
        /// </summary>
        /// <param name="grupos"></param>
        private void llenarGrupos(LinkedList<grupo> grupos)
        {
            cmb_grupo.Items.Clear();
            if (grupos != null)
            {
                foreach (grupo act in grupos)
                {
                    cmb_grupo.Items.Add(new comboBoxItem(act.codGrupo, act.nombre));
                }
            }
        }
            
        /// <summary>
        /// llena las columnas de acuerdo con los campos del tipoUsuario
        /// </summary>
        private void llenarColumnas()
        {
            dgv_Listado.Columns.Clear();
            dgv_Listado.Columns.Add("columna0", "Identificación");
            dgv_Listado.Columns[0].Visible = false;
            dgv_Listado.Columns.Add("columna 1", "Nombre");
            dgv_Listado.Columns.Add("columna 2", "Cédula");
            dgv_Listado.Columns.Add("columna 2", "Domicilio");
        }

        /// <summary>
        /// lista en el DGV la lista de Usuarios recibda
        /// </summary>
        /// <param name="Usuarios"></param>
        private void llenarDTGUsr(LinkedList<usuario> Usuarios)
        {
            llenarColumnas();
            if (Usuarios != null)
            {
                foreach (usuario act in Usuarios)
                {
                    dgv_Listado.Rows.Add(act.idUsuario, act.nombre + " " + act.apellido1 + " " + act.apellido2, act.cedula, act.domicilio);
                }
            }
        }

        #endregion

        #region "controles"

        /// <summary>
        /// Indica si el usuario escogido en el moemnto coincide con el usuario logueado
        /// </summary>
        /// <returns></returns>
        private bool esUsuarioActual()
        {
            if (usuarioActual != null && cp.usuarioActual() != null)
            {
                return usuarioActual.idUsuario == cp.usuarioActual().idUsuario;
            }
            return false;
        }

        /// <summary>
        /// actualiza el estado de los botones de acuerdo con el estado que
        /// se encuentra la ventana(en modo consulta, edición o agregando nuevo)
        /// </summary>
        private void actualizarBotones()
        {
            if (estado.AGREGANDO())
            {
                btn_Nuevo.Enabled = false;
                btn_eliminar.Enabled = false;
                btn_guardar.Enabled = true;
                btn_editar.Enabled = false;
                btn_cancelar.Enabled = true;
                btn_asignarCont.Enabled = false;
            }
            else if (estado.EDITANDO())
            {
                btn_Nuevo.Enabled = false;
                btn_eliminar.Enabled = true && cp.usuarioActualPuede(acciones.USER_ELIMINAR);
                btn_guardar.Enabled = true;
                btn_editar.Enabled = false;
                btn_cancelar.Enabled = true;
                btn_asignarCont.Enabled = true && (cp.usuarioActualPuede(acciones.USER_MODIFICAR_ACT) || cp.usuarioActualPuede(acciones.USER_MODIFICAR_TOD));
            }
            else if (estado.CONSULTANDO())
            {
                btn_Nuevo.Enabled = true && cp.usuarioActualPuede(acciones.USRS_AGREGAR);
                btn_eliminar.Enabled = usuarioActual != null;
                btn_guardar.Enabled = false;
                btn_editar.Enabled = usuarioActual != null && (cp.usuarioActualPuede(acciones.USER_MODIFICAR_TOD) || (esUsuarioActual() && cp.usuarioActualPuede(acciones.USER_MODIFICAR_ACT)));
                btn_cancelar.Enabled = false;
                btn_asignarCont.Enabled = false;
            }
        }

        /// <summary>
        /// actualiza el estado de los campos de texto y CBX de acuerdo con el estado que
        /// se encuentra la ventana(en modo consulta, edición o agregando nuevo)
        /// </summary>
        private void actualizarCampos()
        {
            borrarError(txt_Identificacion);
            borrarError(txb_cedula);
            borrarError(txb_nombre);
            borrarError(txb_apellido1);
            borrarError(txb_apellido2);
            borrarError(cmb_sexo);
            borrarError(cmb_tipoUsuario);
            borrarError(cmb_grupo);
            lbl_mensajes.Text = string.Empty;

            if (estado.AGREGANDO())
            {
                txt_Identificacion.Enabled = true;
                txb_cedula.Enabled = true;
                txb_apellido1.Enabled = true;
                txb_apellido2.Enabled = true;
                txb_nombre.Enabled = true;
                txb_telefono.Enabled = true;
                txb_email.Enabled = true;
                txb_domicilio.Enabled = true;
                cmb_tipoUsuario.Enabled = true;
                cmb_sexo.Enabled = true;
                cmb_grupo.Enabled = true;
                arbol.Activar();
            }
            else if (estado.EDITANDO())
            {
                txt_Identificacion.Enabled = false;
                txb_cedula.Enabled = true;
                txb_apellido1.Enabled = true;
                txb_apellido2.Enabled = true;
                txb_nombre.Enabled = true;
                txb_telefono.Enabled = true;
                txb_email.Enabled = true;
                txb_domicilio.Enabled = true;
                cmb_tipoUsuario.Enabled = cp.usuarioActualPuede(acciones.USER_MODIFICAR_TOD);
                cmb_sexo.Enabled = true;
                cmb_grupo.Enabled = cp.usuarioActualPuede(acciones.USER_MODIFICAR_TOD) ||
                    (cp.usuarioActualPuede(acciones.GRUPOS_MODIFICAR_ACTUAL) && esUsuarioActual());
                if (cp.usuarioActualPuede(acciones.PERF_MODIFICAR))
                    arbol.Activar();
                else
                {
                    arbol.desActivar();
                }
            }
            else if (estado.CONSULTANDO())
            {
                txt_Identificacion.Enabled = false;
                txb_cedula.Enabled = false;
                txb_apellido1.Enabled = false;
                txb_apellido2.Enabled = false;
                txb_nombre.Enabled = false;
                txb_telefono.Enabled = false;
                txb_email.Enabled = false;
                txb_domicilio.Enabled = false;
                cmb_tipoUsuario.Enabled = false;
                cmb_sexo.Enabled = false;
                cmb_grupo.Enabled = false;
                arbol.desActivar();
            }
        }

        /// <summary>
        /// actualiza el estado del tipoUsrActua en caso de que haya
        /// alguno seleccionado del DGV
        /// </summary>
        private void actualizarUsrActual()
        {
            if (estado.CONSULTANDO() && usuarioActual != null)
            {
                usuarioActual = getSelected();
                escribirUsuario();
            }
        }

        /// <summary>
        /// actualiza los campos y los botones
        /// </summary>
        private void actualizaControles()
        {
            actualizarBotones();
            actualizarCampos();
            actualizarUsrActual();
        }

        /// <summary>
        /// limpia los campos de texto
        /// </summary>
        private void limpiarCampos()
        {
            txt_Identificacion.Text = null;
            txb_cedula.Text = null;
            txb_apellido1.Text = null;
            txb_apellido2.Text = null;
            txb_nombre.Text = null;
            txb_telefono.Text = null;
            txb_email.Text = null;
            txb_domicilio.Text = null;
            cmb_grupo.Text = null;
            cmb_sexo.Text = "SEXO";
            cmb_tipoUsuario.Text = null;
            arbol.vaciarCampos();
        }

        #endregion

        #region "acciones"

        private void PasarAgregar()
        {
            if (estado.CONSULTANDO())
            {
                usuarioActual = null;
                estado.agregar();
                actualizaControles();
                limpiarCampos();
            }
        }

        private void PasarConsulta()
        {

            estado.consultar();
            actualizaControles();
            if (usuarioActual == null)
            {
                limpiarCampos();
            }
            else
            {
                escribirUsuario();
            }

        }

        private void PasarEditar()
        {
            if (estado.CONSULTANDO() && getSelected() != null && usuarioActual != null)
            {
                estado.editar();
                actualizaControles();
                filtrarComboBoxGrupos();
            }
        }

        private void filtrarComboBoxGrupos()
        {
            cmb_tipoUsuario_SelectedValueChanged(null, null);
            seleccionarGrupo(usuarioActual.idGrupo);
        }

        private void agregarNuevoUsuario()
        {
            usuario nuevo = getFromFields();
            try
            {
                if (nuevo != null && cp.ctrlUsuario.camposUsuarioValido(nuevo.idUsuario, nuevo.cedula, nuevo.nombre, nuevo.apellido1, nuevo.apellido2, nuevo.mujer, nuevo.password,
                    nuevo.domicilio, nuevo.email, nuevo.telefono, nuevo.idGrupo, nuevo.permisos) && validarCamposAgregar())
                {
                    cp.ctrlUsuario.registrarUsuario(nuevo.idUsuario, nuevo.cedula, nuevo.nombre, nuevo.apellido1, nuevo.apellido2, nuevo.mujer, nuevo.password,
                    nuevo.domicilio, nuevo.email, nuevo.telefono, nuevo.idGrupo, nuevo.permisos);
                    cp.ctrlUsuario.actualizarPassword(nuevo.idUsuario, "biblioteca");
                    estado.consultar();
                    limpiarCampos();
                    actualizaControles();
                }

            }
            catch (Exception e)
            {
                ventanaError(e.Message);
            }
        }

        private void modificarTipoUsuario() 
        {
            usuario nuevo = getFromFields();
            try
            {
                cp.ctrlUsuario.completarDatosUsuario(nuevo);
                if (nuevo != null && usuarioActual != null && cp.ctrlUsuario.camposUsuarioValido(nuevo.idUsuario, nuevo.cedula, nuevo.nombre, nuevo.apellido1, nuevo.apellido2, nuevo.mujer, nuevo.password,
                    nuevo.domicilio, nuevo.email, nuevo.telefono, nuevo.idGrupo, nuevo.permisos) && validarCamposModificar(nuevo))
                {
                    cp.ctrlUsuario.actualizarCampos(nuevo.idUsuario, nuevo.cedula, nuevo.nombre, nuevo.apellido1, nuevo.apellido2, nuevo.mujer, nuevo.password,
                    nuevo.domicilio, nuevo.email, nuevo.telefono, nuevo.estado, nuevo.idGrupo, nuevo.permisos);
                    estado.consultar();
                    limpiarCampos();
                    actualizaControles();
                    mostrarInfo("Datos Actualizados");
                }

            }
            catch (Exception e)
            {
                ventanaError(e.Message);
            }
        }

        private void eliminarTipoUsuarioSelected()
        {
            try
            {
                if (estado.EDITANDO())
                {
                    cp.ctrlUsuario.eliminarUsuario(usuarioActual.idUsuario);
                    limpiarCampos();
                }
                else if (estado.CONSULTANDO() && usuarioActual != null)
                {
                    cp.ctrlUsuario.eliminarUsuario(usuarioActual.idUsuario);
                    limpiarCampos();
                }
            }
            catch (Exception e)
            {
                ventanaError(e.Message);
            }
            actualizaControles();
        }

        #endregion

        #region "métodos botones"

        private void btn_busqUsuario_Click(object sender, EventArgs e)
        {
            objetoReturn r = new objetoReturn();
            new busquedaUsuario(datosActuales, r).ShowDialog();
            if (!string.IsNullOrEmpty(r.objeto))
            {
                txb_busqueda.Text = r.objeto;
            }
        }

        private void btn_Nuevo_Click(object sender, EventArgs e)
        {
            PasarAgregar();
        }

        private void btn_reservas_Click(object sender, EventArgs e)
        {
            cp.abrirVentana(this, controlPrincipal.VENTANA_RESERVAS, new object[] { usuarioActual.idUsuario });
        }

        private void btn_cancelar_Click(object sender, EventArgs e)
        {
            bool modoConsulta = true;
            if (estado.AGREGANDO())
            {
                modoConsulta = confirmarOperacion("No se ha terminado de agreger el elemento");
            }
            else if (estado.EDITANDO())
            {
                modoConsulta = confirmarOperacion("Si continúa no se guardarán los cambios hechos");
            }
            if (modoConsulta)
            {
                PasarConsulta();
            }
        }

        private void btn_guardar_Click(object sender, EventArgs e)
        {
            if (estado.AGREGANDO())
            {
                agregarNuevoUsuario();
            }
            if (estado.EDITANDO())
            {
                modificarTipoUsuario();
            }
        }

        private void btn_editar_Click(object sender, EventArgs e)
        {
            PasarEditar();
        }

        private void btn_eliminar_Click(object sender, EventArgs e)
        {
            eliminarTipoUsuarioSelected();
        }

        private void btn_verPrestamos_Click(object sender, EventArgs e)
        {
            cp.abrirVentana(this, controlPrincipal.VENTANA_PRESTAMOS, new object[] { usuarioActual.idUsuario });
        }


        #endregion

        #region "atributos"

        manejaArbol arbol;
        usuario usuarioActual;
        LinkedList<usuario> datosActuales;

        LinkedList<tipoUsuario> tiposUsuario;
        LinkedList<grupo> grupos;

        bool eventoGrupoblocked = false;

        private static int TODOS = 1;
        private static int MOROSOS = 2;
        private static int MULTAS = 3;
        

        #endregion


    }
}
